﻿/*
实现了一个Json解析器
注：为了性能考虑，Json类使用的是浅拷贝
*/

#ifndef my_JSON_CPP_H
#define my_JSON_CPP_H

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <memory>

class Json
{
public:

	//数据类型
	enum class Type
	{
		json_null = 0,
		json_bool,
		json_int,
		json_double,
		json_string,
		json_array,
		json_object
	};

	//构造函数
	Json();
	Json(bool value);
	Json(int value);
	Json(double value);
	Json(const char* value);
	Json(const std::string& value);
	Json(Type type);
	Json(const Json& other);
	

	//运算符重载
	operator bool();
	operator int();
	operator double();
	operator std::string();
	Json& operator[](const int index);			 //用于数组追加元素 m_array
	Json& operator[](const char* key);			 //用于对象的追加   m_object
	Json& operator[](const std::string& key);	 //用于对象的追加   m_object
	void operator=(const Json& oter);
	bool operator==(const Json& oter);
	bool operator!=(const Json& oter);

	//判断当前对象是否为对应类型
	bool IsNull() { return m_type == Type::json_null; }
	bool IsBool() { return m_type == Type::json_bool; }
	bool IsInt() { return m_type == Type::json_int; }
	bool IsDouble() { return m_type == Type::json_double; }
	bool IsString() { return m_type == Type::json_string; }
	bool IsArray() { return m_type == Type::json_array; }
	bool IsObject() { return m_type == Type::json_object; }

	bool AsBool() const;
	int AsInt() const;
	double AsDouble() const;
	std::string AsString() const;

	//数组追加元素
	void Append(const Json& other);

	//判断在数组中有没有某个索引
	bool Has(int index);
	//判断map中有没有某个键值
	bool Has(const char* key);
	bool Has(const std::string& key);

	//删除数组中的某个元素
	bool Remove(int index);
	//删除对象中的某个元素
	bool Remove(const char* key);
	bool Remove(const std::string& key);

	//以字符串的方式返回数据
	std::string Str() const;

	//用于遍历json数组
	using arrayIterator = std::vector<Json>::iterator;
	//获取json数组的begin迭代器
	arrayIterator Begin();
	//获取json数组的end迭代器
	arrayIterator End();

	//清理
	void Clear();

private:
	//辅助 拷贝构造 和 operaor=
	void _Coyp(const Json& other);
private:
	union Value
	{
		bool	m_bool;
		int		m_int;
		double	m_double;
		std::string* m_string;
		std::vector<Json>* m_array;
		std::map<std::string, Json>* m_object;
	};

	Type  m_type;	//类型
	Value m_value;	//值
};



#endif // !my_JSON_CPP_H

